/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejercicio.practica2;

import static java.lang.Math.pow;
import static java.lang.Math.sqrt;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Objects;
import java.util.Scanner;

/**
 *
 * @author manolo
 */
public class Estadistica {

    private static Scanner teclado = new Scanner(System.in);
    private static ArrayList<Float> datos = new ArrayList();

    public static void main(String[] args) {

        int opcion, numDatos;
        System.out.println("Introduzca el número de datos: ");
        numDatos = teclado.nextInt();

        for (int i = 0; i < numDatos; i++) {
            System.out.println("Dato " + (i + 1) + ": ");
            datos.add(teclado.nextFloat());
        }

        do {
            System.out.println("");
            System.out.println("**********************************");
            System.out.println("Elija la función que desea evaluar");
            System.out.println("**********************************");
            System.out.println("");
            System.out.println("1.- Media");
            System.out.println("2.- Moda");
            System.out.println("3.- Varianza");
            System.out.println("4.- Desviación tipica");
            System.out.println("0.- Salir");
            opcion = teclado.nextInt();
            switch (opcion) {
                case 1:
                    System.out.println("La media es: " + media(datos));
                    break;
                case 2:
                    System.out.println("La moda es: " + moda(datos));
                    break;
                case 3:
                    System.out.println("La varianza es: " + varianza(datos));
                    break;
                case 4:
                    System.out.println("La desviación típica es: " + desviacion(datos));
                    break;
                case 0:
                    System.exit(0);
                default:
                    System.out.println("La opción elegida no es válida");
                    ;
            }

        } while (opcion != 0);
    }

    private static float media(ArrayList<Float> lista) {
        float resultado = 0;
        int numDatos;

        numDatos = lista.size();

        for (int i = 0; i < numDatos; i++) {
            resultado += lista.get(i);
        }
        return resultado / numDatos;
    }

    private static float moda(ArrayList<Float> lista) {
        float resultado = 0;
        int cuenta = 0, maximo = 0;
        Collections.sort(lista);
        for (int i = 0; i < lista.size(); i++) {
            cuenta = 0;
            for (int j = 1; j < lista.size(); j++) {
                if (Objects.equals(lista.get(i), lista.get(j))) {
                    cuenta++;
                }
                if (cuenta > maximo) {
                    resultado = lista.get(i);
                    maximo = cuenta;
                }
            }
        }
        return resultado;
    }

    private static float varianza(ArrayList<Float> lista) {
        float resultado = 0, promedio;
        int numDatos;

        promedio = media(lista);
        numDatos = lista.size();

        for (int i = 0; i < numDatos; i++) {
            resultado += pow(lista.get(i), 2);
        }
        return (float) (resultado / numDatos - pow(promedio, 2));
    }

    private static float desviacion(ArrayList<Float> lista) {
        float resultado = 0;

        resultado = (float) sqrt(varianza(lista));
        return resultado;
    }
}
